home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / inctree < prev    next >
Text File  |  1991-01-08  |  2KB  |  91 lines

  1. #!/usr/bin/perl
  2.  
  3. # Usage: inctree [options] [files]
  4.  
  5. # Configuration parameters.
  6.  
  7. $CPP = 'cc -E';
  8. # $CPP = "cc -P";
  9. # $CPP = "/lib/cpp";
  10.  
  11. $shiftwidth = 4;
  12.  
  13. # Process switches.
  14.  
  15. while ($ARGV[0] =~ /^-/) {
  16.     $_ = shift;
  17.     if (/^-D(.*)/) {
  18.     $defines .= " -D" . ($1 ? $1 : shift);
  19.     }
  20.     elsif (/^-I(.*)/) {
  21.     $includes .= " -I" . ($1 ? $1 : shift);
  22.     }
  23.     elsif (/^-m(.*)/) {
  24.     push(@pats, $1 ? $1 : shift);
  25.     }
  26.     elsif (/^-l/) {
  27.     $lines++;
  28.     }
  29.     else {
  30.     die "Unrecognized switch: $_\n";
  31.     }
  32. }
  33.  
  34. # Build a subroutine to scan for any specified patterns.
  35.  
  36. if (@pats) {
  37.     $sub = "sub pats {\n";
  38.     foreach $pat (@pats) {
  39.     $sub .= "    print '>>>>>>> ',\$_ if m$pat;\n";
  40.     }
  41.     $sub .= "}\n";
  42.     eval $sub;
  43.     ++$pats;
  44. }
  45.  
  46. # Now process each file on the command line.
  47.  
  48. foreach $file (@ARGV) {
  49.     open(CPP,"$CPP $defines $includes $file|")
  50.     || die "Can't run cpp: $!\n";
  51.     $line = 2;
  52.  
  53.     while (<CPP>) {
  54.     ++$line;
  55.     &pats if $pats;      # Avoid expensive call if we can.
  56.     next unless /^#/;
  57.     next unless /^# \d/;
  58.     ($junk,$newline,$filename) = split;
  59.     $filename =~ s/"//g;
  60.  
  61.     # Now figure out if it's a push, a pop, or neither.
  62.  
  63.     if ($stack[$#stack] eq $filename) {     # Same file.
  64.         $line = $newline-1;
  65.         next;
  66.     }
  67.  
  68.     if ($stack[$#stack-1] eq $filename) {   # Leaving file.
  69.         $indent -= $shiftwidth;
  70.         $line = pop(@lines)-1;
  71.         pop(@stack);
  72.     }
  73.     else {                                  # New file.
  74.         printf "%6d  ", $line-2 if $lines;
  75.         push(@lines,$line);
  76.         $line = $newline;
  77.         print "\t" x ($indent / 8), ' ' x ($indent % 8),
  78.         $filename;
  79.         print "  DUPLICATE" if $seen{$filename}++;
  80.         print "\n";
  81.         $indent += $shiftwidth;
  82.         push(@stack,$filename);
  83.     }
  84.     }
  85.     close CPP;
  86.     $indent = 0;
  87.     %seen = ();
  88.     print "\n\n";
  89.     $line = 0;
  90. }
  91.